### Геометрические фигуры
Все числовые данные в этой работе должны быть представлены значениями с плавающей запятой.
Использование контейнеров стандартной библиотеки в настоящей работе недопустимо (за исключением
```std::string``` для обработки ввода)
1. Создать файл base-types.hpp, содержащий определения следующих структур:

• ```point_t```, представляющую собой точку на плоскости, координаты должны храниться в полях
x и y.
• ```rectangle_t```, описывающую прямоугольник шириной width и высотой height с центром в точке
pos.

2. Создать файл ```shape.hpp```, содержащий определение абстрактного класса ```Shape```. Этот класс должен
предоставлять следующие методы:
```getArea``` вычисление площади
```getFrameRect``` получение ограничивающего прямоугольника для фигуры (см. типы из предыдущего пункта), стороны ограничивающего прямоугольника всегда параллельны осям
```move``` перемещение центра фигуры, 2 варианта: в конкретную точку и в виде смещений по осям
абсцисс и ординат
```scale``` изотропное масштабирование фигуры относительно её центра с указанным коэффициентом
3. Реализовать класс ```Rectangle``` в файлах ```rectangle.hpp``` и ```rectangle.cpp```, соответственно.
4. Дополнительно реализовать ещё 2 (две) геометрические фигуры, указанные преподавателем.
5. Продемонстрировать правильную работу классов программой, демонстрирующей полиморфное при-
менение классов. Использование контейнеров стандартной библиотеки в настоящей работе недопу-
стимо. Управление памятью должно осуществляться с помощью умных указателей, предоставляе-
мых стандартной библиотекой (см. ```std::unique_ptr```, ```std::shared_ptr``` и ```std::weak_ptr```).

• Программа должна быть реализована в виде 1-го исполняемого файла, не обрабатывающего
параметры командной строки.

• Программа должна обрабатывать поток стандартного ввода, содержащий описание геометрических фигур.
Каждая строка гарантировано содержит описание не более одной фигуры. Элементы в описании разделены ровно одним пробелом и гарантировано являются вещественными
числами (за исключением названия фигур) Описание завершается командой масштабирования
фигур. Пример описания:
```txt
CIRCLE 1.15 2.5 10.1
RECTANGLE -5.9 -3.4 3.0 4.0
SQUARE -1.55 -1.55 10.5
TRIANGLE 1.3 2.2 3.2 5.0 10.0 -5.5
POLYGON 1.3 2.2 3.2 5.0 10.0 -5.5
SCALE -15.0 -7.5 1.5
```

• Каждая фигура описывается своим набором параметров. Отсутствие самопересечений, выпуклость фигур и корректное количество, и только количество, параметров гарантируется, если не
сказано иного:
– Прямоугольник описывается парой координат своих углов: левым нижним и правым верхним. Считайте, что стороны прямоугольника параллельны осям координат.
Центром фигуры считайте точку пересечения диагоналей
```txt
RECTANGLE 1.0 1.0 3.0 4.0
RECTANGLE 0.0 0.0 -2.0 -10.0
```

– Круг описывается координатами центра и радиусом. Радиус должен быть положительным.
Центром фигуры считайте центр окружности
```txt
CIRCLE 2.0 3.0 15.0
```

– Кольцо описывается координатами цетра и парой радиусов: внешней и внутренней окружности соответственно. Центром фигуры считайте центры окружностей
```txt
RING 2.0 3.0 20.0 15.0
```

– Эллипс описывается координатами центра и двумя значениями радиусов: по вертикальной
оси и по горизонатльной оси. Считайте, что оси эллипса параллельны осям координатам.
Центром эллипса считайте точку пересечения осей эллипса
```txt
ELLIPSE 0.0 0.0 10.0 20.0
```

– Квадрат описывается координатами своего левого нижнего угла и длиной стороны. Считайте, что стороны квадрата параллельны осям координат. Центром фигуры считайте точку
пересечения диагоналей
```txt
SQUARE 6.0 7.0 1.0
```

– Треугольник описывается координатами трёх своих вершин. Условия треугольника должны
быть соблюдены. Центром фигуры считать центр тяжести фигуры
```txt
TRIANGLE 0.0 0.0 1.0 1.0 0.0 1.0
```
– Параллелограмм описывается тремя вершинами, составляющими треугольник, одна из сторон
которого является диагональю параллелограмма, а две дургие — сторонами параллелограмма. Стороны параллелограмма формируются первой и последней парой вершин. При
этом одна из сторон должна быть параллельна оси абсцисс. Центром фигуры считать точку
пересечения диагоналей
```txt
PARALLELOGRAM 0.0 1.0 10.0 1.0 5.0 0.0
PARALLELOGRAM 0.0 1.0 10.0 1.0 5.0 5.0
```

– Ромб описывается тремя вершинами, составляющими треугольник, две стороны которого
являются частью диагоналей ромба. Считайте, что диагонали ромба должны быть параллельны осям координат. Центром фигуры считайте точку пересечения диагоналей
```txt
DIAMOND 0.0 5.0 10.0 0.0 0.0 0.0
```

– Правильный многоугольник задаётся тремя вершинами. Вершины должны соответствовать
условиям треугольника и формировать прямоугольный треугольник, гипотенуза которого
равна радиусу описанной у многоугольника окружности, а один из катетов - радиусу вписанной в многоугольник окружности. Считайте центром фигуры первую из трёх вершин.
```txt
REGULAR 0.0 0.0 0.0 1.0 1.0 1.0
```

– Полигон описывается координатам своих вершин. Центром фигуры считайте центр тяжести
фигуры. При этом количество точек в описании должно быть достаточным для формирования полигона. Кроме того, никакие точки не должны совпадать
```txt
POLYGON 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0
```

– Невыпуклый четырёхугольник описывается четыремя вершинами. Первые три должны удовлетворять свойствам треугольника.
Четвёртая вершина должна лежать внутри треугольника, формируемого первыми тремя вершинами. Вогнутость четырёхугольника формируется
последними тремя вершинами в описании. Центром фигуры считайте точку, формирующую вогнутость
```txt
CONCAVE 0.0 5.0 0.0 0.0 10.0 -1.0 1.0 1.0
```

– Четырёхугольник с самопересечениями задаётся координатами двух своих пересекающихся
сторон. Центром фигуры считайте точку пересечения этих сторон. Кроме того, считайте,
что первая и последняя вершины в описании формируют сторону фигуры
```txt
COMPLEXQUAD 0.0 0.0 10.0 10.0 2.0 0.0 3.0 0.0
```

• Команда масштабирования содержит параметры изотропного масштабирования: по порядку
координаты центра, относительно которого необходимо произвести масштабирование, и коэффициент масштабирования. Коэффициент должен быть положительным

• После выполнения масштабирования в соответствии с указанными параметрами, программа
должна вывести в стандартный вывод на отдельных строках:

– суммарную площадь и координаты ограничивающих прямоугольников обрабатываемых
фигур в порядке их описания до масштабирования.

– суммарную площадь и координаты ограничивающих прямоугольников обрабатываемых
фигур в порядке их описания после масштабирования
Элементы должны быть разделены ровно одним пробелом, содержать один и только один знак
после запятой (округление проводить в соотвествии с правилами математики) и описаны в
следующем порядке.

• Пустые строки в описании фигур игнорируются

• Описания фигур не реализованных в программе должны игнорироваться, как если бы строка
была пустой

• Если описание фигуры содержит ошибку, но её описание неверно, программа игнорирует её, но
после масштабирования в стандартной поток ошибок должно выводиться сообщение о наличии
ошибок в описании поддерживаемых фигур (конкретные фигуры указывать не требуется)

• Программа должна завершаться с сообщением об ошибке и ненулевым кодом возврата, если
ввод завершился EOF (на Linux: Ctrl + D | на Windows: Ctrl + Z затем Enter), но команда
масштабирования не описана или имеет некорректный коэффициент масштабирования

• Описание каждого ограничивающего прямоугольника в выводе должно содержать по порядку
координаты левого нижнего угла и координаты правого верхнего угла. Например для входных
данных:
```txt
RECTANGLE -1.0 -1.0 1.0 1.0
SQUARE -2.0 -2.0 4.0
SQUARE -10.0 -5.0 -5.0
SCALE 0.0 0.0 2.0
```
– Если фигура SQUARE не поддерживается программой, то в стандартный поток вывода
должно быть выведено:
```txt
4.0 -1.0 -1.0 1.0 1.0
16.0 -2.0 -2.0 2.0 2.0
```

– Если фигура SQUARE поддерживается программой, то в стандартный поток вывода должно быть выведено:
```txt
20.0 -1.0 -1.0 1.0 1.0 -2.0 -2.0 2.0 2.0
80.0 -2.0 -2.0 2.0 2.0 -4.0 -4.0 4.0 4.0
```
А в стандартный поток ошибок необходимо вывести сообщение о наличии некорректной
фигуры. При этом код возврата должен быть нулевым.
